package com.sykj.why.mongo.service.impl;

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.sykj.why.exception.WhyException;
import com.sykj.why.mongo.dao.SystemMenuTDao;
import com.sykj.why.mongo.document.entity.ProgramaT;
import com.sykj.why.mongo.document.entity.SystemMenuT;
import com.sykj.why.mongo.enums.exception.ResultEnum;
import com.sykj.why.mongo.service.SystemMenuTService;
import com.sykj.why.util.DateTool;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author Eleven
 * @date 2019/6/5
 * @desc 系统菜单业务实现层
 */

@Service("SystemMenuTService")
public class SystemMenuTServiceImpl extends BasicServiceImpl<SystemMenuT> implements SystemMenuTService {

    @Autowired
    private SystemMenuTDao systemMenuTDao;

    /**
     * 添加系统菜单
     * @param systemMenuT
     */
    @Override
    public void saveSystemMenu(SystemMenuT systemMenuT) {
        //验证系统菜单名称是否重复
        verifyName(systemMenuT);
        //排序
        long count = systemMenuTDao.count(SystemMenuT.class, false);
        systemMenuT.setSort((int) count);
        systemMenuT.setCreateTime(DateTool.getSystemTime());
        systemMenuT.setUpdateTime(DateTool.getSystemTime());
        //保存
        systemMenuTDao.save(systemMenuT);
    }

    /**
     * 删除菜单
     * @param id
     */
    @Override
    public void removeSystemMenu(String id) {
        //通过Id查询系统菜单
        SystemMenuT systemMenuT = findById(id);
        //逻辑删除系统菜单
        systemMenuTDao.remove(systemMenuT);
        //删除该菜单下的子菜单
    }

    /**
     * 修改菜单
     * @param systemMenuT
     */
    @Override
    public void updateSystemMenu(SystemMenuT systemMenuT) {
        //通过id查询系统菜单
        SystemMenuT systemMenu = findById(systemMenuT.getId());
        //重新赋值
        //验证用户名称是否重复
        verifyName(systemMenuT);
        systemMenu.setName(systemMenuT.getName());
        systemMenu.setIcon(systemMenuT.getIcon());
        systemMenu.setUrl(systemMenuT.getUrl());
        systemMenu.setUpdateTime(DateTool.getSystemTime());
        //保存或修改
        systemMenuTDao.saveOrupdate(systemMenu);
    }

    /**
     * 启用/禁用菜单
     * @param id
     * @param flag
     */
    @Override
    public void disableOrEnable(String id, boolean flag) {
        //通过id查询用户
        SystemMenuT systemMenuT = findById(id);
        //修改状态
        systemMenuTDao.disableOrEnable(systemMenuT,flag);
    }

    /**
     * 验证系统菜单名称是否重复
     * @param systemMenuT
     */
    @Override
    public void verifyName(SystemMenuT systemMenuT) {
        Query query = new Query();
        query.addCriteria(Criteria.where("id").ne(systemMenuT.getId()).
                and("name").is(systemMenuT.getName()).and("removed").is(false));
        SystemMenuT systemMenu = systemMenuTDao.findOne(query,SystemMenuT.class);
        if (systemMenu != null) {
            throw new WhyException(ResultEnum.REPEAT);
        }
    }

    /**
     * 通过id查询系统菜单
     * @param id
     * @return
     */
    @Override
    public SystemMenuT findById(String id) {
        //通过id查询未删除的用户
        Query query = new Query();
        query.addCriteria(Criteria.where("id").is(id).and("removed").is(false));
        SystemMenuT systemMenuT = systemMenuTDao.findOne(query,SystemMenuT.class);
        if (systemMenuT!=null){
            return systemMenuT;
        }else {
            throw new WhyException(ResultEnum.OBJISNULL);
        }
    }

    /**
     * 查询所有系统菜单
     * @return
     */
    @Override
    public List<SystemMenuT> findAll() {
        //查询未删除和未禁用的所有系统菜单
        Query query = new Query();
        query.addCriteria(Criteria.where("removed").is(false).and("enable").is(true));
        List<SystemMenuT> list = systemMenuTDao.findAll(query,SystemMenuT.class);
        return list;
    }

    /**
     * 获取父级下的子菜单
     * @param pid
     * @return
     */
    @Override
    public List<SystemMenuT> getSystemMenuListByPid(String pid) {
        Query query = new Query();
        query.addCriteria(Criteria.where("removed").is(false).and("enable").is(true)
                .and("pid").is(pid));
        List<SystemMenuT> menuList= systemMenuTDao.findAll(query,SystemMenuT.class);
        return menuList;
    }

    /**
     * 获取跟菜单下的所有菜单信息
     * @param pid
     * @return
     */
    @Override
    public JsonObject getAllSystemMenuTreeByPid(String pid){
        JsonObject resultObject=new JsonObject();
        JsonArray jsonArray=this.getSystemMenuTreeByPid(pid);//得到所有一级菜单
        for(int i=0;i<jsonArray.size();i++){
            JsonObject jsonObject=(JsonObject) jsonArray.get(i);
            //判断该节点下时候还有子节点
            List<SystemMenuT> systemMenuTS = this.getSystemMenuListByPid(jsonObject.get("id").getAsString());
            //if("true".equals(jsonObject.get("spread").getAsString())){
            if (systemMenuTS.size() == 0) {
                continue;
            }else{
                //由于后台模板的规定，一级菜单以title最为json的key
                resultObject.add(jsonObject.get("title").getAsString(),getAllMenuJsonArrayByParentId(jsonObject.get("id").getAsString()));
            }
        }
        return resultObject;
    }

    /**
     * 获取父级下的子菜单以树形结构
     * @param pid
     * @return
     */
    public JsonArray getSystemMenuTreeByPid(String pid){
        List<SystemMenuT> menuList= getSystemMenuListByPid(pid);
        JsonArray jsonArray=new JsonArray();
        for(SystemMenuT menuT:menuList){
            JsonObject jsonObject=new JsonObject();
            jsonObject.addProperty("id", menuT.getId()); // 节点id
            jsonObject.addProperty("title", menuT.getName()); // 节点名称
            jsonObject.addProperty("spread", false); // 不展开
            jsonObject.addProperty("icon", menuT.getIcon());
            if(StringUtils.isNotEmpty(menuT.getUrl())){
                jsonObject.addProperty("href", menuT.getUrl()); // 菜单请求地址
            }
            jsonArray.add(jsonObject);
        }
        return jsonArray;
    }

    //获取根频道下子频道菜单列表集合
    private JsonArray getAllMenuJsonArrayByParentId(String pid){
        JsonArray jsonArray = this.getSystemMenuTreeByPid(pid);
        for(int i=0;i<jsonArray.size();i++){
            JsonObject jsonObject = (JsonObject)jsonArray.get(i);
            //判断该节点下是否还有子节点
            List<SystemMenuT> systemMenuTS = this.getSystemMenuListByPid(jsonObject.get("id").getAsString());
            if (systemMenuTS.size() == 0) {
                continue;
            }else{
                //二级或三级菜单
                jsonObject.add("children", getAllMenuJsonArrayByParentId(jsonObject.get("id").getAsString()));
            }
        }
        return jsonArray;
    }

}
